home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Merciful 5
/
Merciful - Disc 5.iso
/
software
/
r
/
real_3d
/
real3dv3.3b.dms
/
real3dv3.3b.adf
/
RPL.LZH
/
RPL
/
methods.rpl
< prev
next >
Wrap
Text File
|
1995-05-04
|
4KB
|
142 lines
( ------------------------------------------------------------
( This example demonstrates how to expand the animation system
( of Real 3D by defining new methods. The file defines three new
( methods: ABS_PATH, CHAIN and WEIRD_FORCE. If you add the line
( "methods.rpl" LOAD to you rpl-startup, these methods will be
( automatically installed.
( ------------------------------------------------------------
"r3d3:rpl/sys/vectors.rpl" LOAD
"r3d3:rpl/sys/objects.rpl" LOAD
"r3d3:rpl/sys/tags.rpl" LOAD
( This function is used by all custom methods found from this file.
( It fetches addresses of all valid target objects on the stack.
: GetTargets
0 ( 0 terminates the list
o2 FETCH O_GETSUB ( first sub object
BEGIN
DUP IF ( test if the object address is not zero
DUP O.wMETHOD + WFETCH ( fetch the contents of wMETHOD field
NOT IF ( if zero, valid target
DUP
ENDIF
ELSE ( object address was zero,
DROP
EXIT
ENDIF
O_GETNEXT ( fetch the address of the next object
AGAIN
;
( ABS_PATH
( This is the actual object procedure for ABS_PATH
: OP_AbsPath
GetTargets ( fetch target objects
o1 FETCH O_GETSUB ( find the parameter object
DUP NOT IF ( if no parameter object, syntax error
"Parameter Object Missing" ERROR
ENDIF
t FFETCH u FFETCH v FFETCH O_EVAL
0 M_MOVECOG
1 ( return 1, everything is okay
;
( This creates the method ABS_PATH
& OP_AbsPath "ABS_PATH" MTH_CREATE DROP
( The CHAIN method attemps to keep the distance between all objects
( the same.
FVARIABLE fLen
VVARIABLE vTmp
: Distribute ( 0 aObjects .... fDist )
fLen FSTORE
iOP_COG O_PROP vTmp VSTORE
BEGIN
DUP
WHILE
DUP iOP_COG O_PROP
vTmp VFETCH VSUB VNORM
fLen FFETCH VMUL
vTmp VFETCH VADD vTmp VSTORE
0 SWAP vTmp VFETCH 0 M_MOVECOG
REPEAT
DROP
;
( Actual CHAIN Object Procedure. The tag "FDIS" can be associated with
( the method object in order to define the distance between targets.
( If the tag is not defined, the default distance 0.5 is used.
: OP_Chain
GetTargets
o1 FETCH "FDIS" O_FINDTAG DUP
IF
4 + FETCH FFETCH
ELSE
DROP
0.5
ENDIF
Distribute
1
;
( Create CHAIN method
& OP_Chain "CHAIN" MTH_CREATE DROP
( The WEIRD_FORCE demonstrates how to create physical oriented `particle-
( system` methods. The method generates random force fields affecting to
( the velocity and the spin of target objects.
: GetVelForce
RANDOM 0.5 F- RANDOM 0.5 F- RANDOM 0.5 F-
;
: GetSpinForce
RANDOM 0.5 F- RANDOM 0.5 F- RANDOM 0.5 F-
;
: DoWeirdSPI ( aObj )
"VSPI" O_FINDTAG DUP ( attemp to find VSPI tag of given object
IF ( found, so
T.aVAL + FETCH DUP VFETCH ( fetch the tag value
GetSpinForce ( fetch force affecting to target
dt FFETCH 6.28 F* VMUL VADD ( calculate new velocity
4 ROLL VSTORE ( assign it back to the target`s tag
ELSE ( not found, so create it
DROP DUP "CEND" 0 0 0 "VSPI" O_CREATAG DROP
ENDIF
;
: DoWeirdVEL ( aObj )
"VVEL" O_FINDTAG DUP
IF
T.aVAL + FETCH DUP VFETCH GetVelForce dt FFETCH VMUL VADD 4 ROLL VSTORE
ELSE
DROP DUP "CEND" 0 0 0 "VVEL" O_CREATAG DROP
ENDIF
;
: OP_WeirdForce
GetTargets ( fetch all targets on the stack
BEGIN ( loop through all of them
DUP
WHILE
DUP DoWeirdVEL ( apply force field to velocity
DUP DoWeirdSPI ( apply force field to spin
DROP
REPEAT
DROP
1 ( all OK
;
( Install WEIRD_FORCE method
& OP_WeirdForce "WEIRD FORCE" MTH_CREATE DROP